package ui.swing.tree.filesystem;

import java.io.File;

/**
 * 功能：该类作为树的UserObject，将一个待储存在树中的文件的信息封装，以便操作。
 *       内部用绝对路径文件对象存放对应的文件。
 *       待进一步完善
 * @author 林可
 * @version 1.0 2009-11-12
 */
public class FileNode {

	// 对应的文件系统上的文件
	private File file;
	
	// 在树中的显示名称
	private String displayName;
	
	// 是否虚节点
	private boolean virtual;
	
	/**
	 * 创建一个 <code>FileNode</code> 实例， 此构造函数创建“虚”节点，
	 * 只为显示名字使用，不对应具体文件
	 *
	 * @param displayName 在树种显示的名字，不能为空，不能为空字符串
	 */
	public FileNode(String displayName) {
		this(null, displayName, true);
	}
	
	/**
	 * 创建一个 <code>FileNode</code> 实例，  此构造函数创建“实”节点，
	 * 对应具体的文件，在树中显示为文件名
	 * 
	 * @param file 要对应的文件，这个文件不能为null并且必须在文件系统中存在
	 */
	public FileNode(File file) {
		this(file, null);
	}
	
	/**
	 * 创建一个 <code>FileNode</code> 实例，  此构造函数创建“实”节点，
	 * 对应具体的文件
	 * 
	 * @param file 要对应的文件，这个文件不能为null并且必须在文件系统中存在
	 * @param displayName 在树种显示的名字，为空则显示文件名 
	 */
	public FileNode(File file, String displayName) {
		this(file, displayName, false);
	}
	
	private FileNode(File file, String displayName, boolean virtual) {
		this.virtual = virtual;
		if(!isVirtual()) { // 如果是实节点，则要求文件必须存在
			if(file == null) {
				throw new IllegalArgumentException("实节点对应的文件错误：" + file == null? "File is null" : file.getPath() + " not found");
			}
			if(!file.isAbsolute()) { // 对存在的文件取绝对路径
				file = file.getAbsoluteFile();
			}
			this.file = file;
			this.displayName = displayName;
		}
		else { // 如果是虚节点
			if(displayName == null || "".equals(displayName))
				throw new IllegalArgumentException("虚节点的显示名字不能为空");
			this.file = null;
			this.displayName = displayName;
		}
		
	}
	
	@Override
	public String toString() {
		return isVirtual()? displayName : displayName == null ? file.getName() : displayName;
	}
	
	public File getFile() {
		return file;
	}

	public String getDisplayName() {
		return displayName;
	}
	
	public boolean isVirtual() {
		return virtual;
	}
	
	public String getLocation() {
		return isVirtual()? displayName : file.getAbsolutePath();
	}
}
